package modeloCarmenSanDiego.persistencia;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import modeloCarmenSanDiego.*;
import modeloCarmenSanDiego.caracteristicas.*;
import modeloCarmenSanDiego.edificios.*;
import modeloCarmenSanDiego.pistas.*;


import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class CargadorDeArchivos {

	private String nombreDeArchivoCiudades;
	private String nombreArchivoSospechosos;
	private String nombreArchivoPartidaGuardada;
	
	public CargadorDeArchivos(String nombreArchivoCiudades, String nombreArchivoSospechosos, String nombreArchivoPartidaGuardada){
		this.nombreArchivoSospechosos = nombreArchivoSospechosos; 
		this.nombreDeArchivoCiudades = nombreArchivoCiudades;
		this.nombreArchivoPartidaGuardada = nombreArchivoPartidaGuardada;
	}
	
	public List<ObjetoRobado> cargarCiudadesYObjetosRobados(Reloj reloj){
	    SAXBuilder builder = new SAXBuilder();
	    List<ObjetoRobado> objetosQuePuedenSerRobados = new ArrayList<ObjetoRobado>();
	    try
	    {
	        Document document = null;
	     	document =  builder.build(this.nombreDeArchivoCiudades);

	     	//Se obtiene la raiz 'Ciudades'
	        Element rootNode = document.getRootElement();
	        List<Element> listaDeCiudades = rootNode.getChildren( "Ciudad" );
	 
	        for ( Element ciudad : listaDeCiudades )
	        {
	            String nombre = ciudad.getChildTextTrim("nombre");
	            String latitudString = ciudad.getChildTextTrim("Latitud");
                Double latitudDouble = Double.parseDouble(latitudString); 
                String longitudString = ciudad.getChildTextTrim("Longitud");
                Double longitudDouble = Double.parseDouble(longitudString);
 	            Ciudad ciudadACargar = new Ciudad(nombre,latitudDouble,longitudDouble);
	            
	            ciudadACargar.addEdificio(new Puerto(reloj));
	            ciudadACargar.addEdificio(new Biblioteca(reloj));
	            ciudadACargar.addEdificio(new Banco(reloj));

	            //Obtengo el nombre de la Joya de La ciudad y lo agrego a la lista
	            String ObjARobar = ciudad.getChildTextTrim("ObjetoPreciado");
	            objetosQuePuedenSerRobados.add(new ObjetoRobado(ObjARobar,ciudadACargar));
	         	
	            //Cargo las pistas segun los enums
	            Element rootPistas = ciudad.getChild("pistas");
	            for ( Tema tema : Tema.values()){
	            	Element rootPistasPorTema = rootPistas.getChild(tema.nombre()); 
	            	for( DificultadDePista dificultad : DificultadDePista.values()){
	            		String stringDePista = rootPistasPorTema.getChildTextTrim(dificultad.nombre());
	            		ciudadACargar.addCaracteristica(dificultad, tema, stringDePista);
	            	}
	            }
	            
	        	
				
			}
	        return objetosQuePuedenSerRobados;
	    }catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
		return null;
	}
	
	public void cargarSospechosos(Comisaria comisaria){
	    SAXBuilder builder = new SAXBuilder();
	    try
	    {
	    	Document document =  builder.build(this.nombreArchivoSospechosos);
	    	Element rootNode = document.getRootElement();
	        List<Element> list = rootNode.getChildren( "Sospechoso" );
	        for ( Element sospechoso : list )
	        {
	        	Sospechoso sospechosoACargar = parsearASospechoso(
	        			sospechoso.getChildTextTrim("Nombre"), 
	        			sospechoso.getChildTextTrim("Sexo"),
	        			sospechoso.getChildTextTrim("Hobby"),
	        			sospechoso.getChildTextTrim("Cabello"),
	        			sospechoso.getChildTextTrim("Senia"),
	        			sospechoso.getChildTextTrim("Vehiculo"));
	        	comisaria.addSospechoso(sospechosoACargar);
	        }
	    }catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
	    	    
	}
	
	private Sospechoso parsearASospechoso(
			String nombre,
			String sexoString,
			String hobbyString,
			String cabelloString, 
			String seniaString,
			String vehiculoString) {
		Sexo sexo; Hobby hobby; Cabello cabello; Senia senia; Vehiculo vehiculo;
		try{ 
			//paso las caracteristicas a mayusculas por los nombres de la constantes enums
			sexo = Sexo.valueOf(sexoString.toUpperCase());
			hobby = Hobby.valueOf(hobbyString.toUpperCase()); 
			cabello = Cabello.valueOf(cabelloString.toUpperCase());
			senia = Senia.valueOf(seniaString.toUpperCase());
			vehiculo = Vehiculo.valueOf(vehiculoString.toUpperCase());
		} catch (IllegalArgumentException e) {
			//default
			sexo = Sexo.MASCULINO;
			hobby = Hobby.TENIS;
			cabello = Cabello.CASTANIO;
			senia = Senia.ANILLO;
			vehiculo = Vehiculo.DEPORTIVO;
		}
		return new Sospechoso(nombre, sexo, hobby, cabello, senia, vehiculo);
	}

	public Reloj cargarReloj() {
	    SAXBuilder builder = new SAXBuilder();
	    int hora = 0; int dia = 0;
	    try
	    {
	    	Document document =  builder.build(this.nombreArchivoPartidaGuardada);
	    	Element rootCaso = document.getRootElement();
	        Element elementoReloj = rootCaso.getChild("reloj");
	        hora = Integer.parseInt(elementoReloj.getChildTextTrim("hora"));
	        dia = Integer.parseInt(elementoReloj.getChildTextTrim("dia"));
	        return new Reloj(dia, hora);
	   	}catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
		return new Reloj(dia, hora);
	}

	public ObjetoRobado cargarObjetoRobado(Policia policia, Reloj reloj, Ciudad ciudadDeOrigen) {
		SAXBuilder builder = new SAXBuilder();
		String nombreDelObjetoRobado = "";
		try
	    {
	    	Document document =  builder.build(this.nombreArchivoPartidaGuardada);
	    	Element rootCaso = document.getRootElement();
	        Element elementoObjetoRobado = rootCaso.getChild("robado");
	        nombreDelObjetoRobado = elementoObjetoRobado.getChildTextTrim("nombre");
	   	}catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
		ObjetoRobado robado = new ObjetoRobado(nombreDelObjetoRobado, ciudadDeOrigen);
        robado.asignarValorAlObjeto(policia.getRango().getValorDeObjeto());
        return robado;
	}

	public Policia cargarPolicia(Reloj reloj) {
		SAXBuilder builder = new SAXBuilder();
		int cantidadDeArrestos = 0;
		String nombreCiudad = null;
		try
	    {
	    	Document document =  builder.build(this.nombreArchivoPartidaGuardada);
	    	Element rootCaso = document.getRootElement();
	        Element elementoPolicia = rootCaso.getChild("policia");
	        cantidadDeArrestos = Integer.parseInt(elementoPolicia.getChildTextTrim("cantidadDeArrestos"));
	        nombreCiudad = elementoPolicia.getChildTextTrim("nombreCiudad");
	    }catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
		Ciudad ciudad = new Ciudad(nombreCiudad,1222,1222);
		Policia policia = new Policia(reloj);
		policia.setCiudadActual(ciudad);
        for (int i=0; i < cantidadDeArrestos; i++) policia.addArresto();
        return policia;
	}

	
	public OrdenDeArresto cargarOrdenDeArresto() {
		SAXBuilder builder = new SAXBuilder();
		String nombreAcusado = "";
		try
	    {
	    	Document document =  builder.build(this.nombreArchivoPartidaGuardada);
	    	Element rootCaso = document.getRootElement();
	        nombreAcusado = rootCaso.getChildTextTrim("acusado");
	   	}catch ( IOException io ) {
	        System.out.println( io.getMessage() );
	    }catch ( JDOMException jdomex ) {
	        System.out.println( jdomex.getMessage() );
	    }
	    return new OrdenDeArresto(nombreAcusado);
	}
}
